package tutorial.main.control;

import java.sql.Timestamp;

import tutorial.main.config.AnacronteConfig;

import android.graphics.Bitmap.Config;
import android.util.Log;

//TODO Lanzar las excepciones

public class HTTPProxy {

	// Conexion URL de datos
	private ServiceConsumer http;
	// Mantiene la clave del usuario
	public static int clave_usuario;
	// Mantiene el nombre de Usuario, porlas
	public static String nombre_usuario;
	// Mantiene el ID de la Sesion
	public static int sid;
	// HOST DE CONEXION
	private String host;
	
	public HTTPProxy()
	{
		//this.host = "http://10.0.2.2:8080/ConnectivityStore/ConnectivityStore?";
		this.host = AnacronteConfig.getInstance().getPropiedad("SYNC_SERVER_URL");
		this.http = new ServiceConsumer();
	}
	
	/**
	 * Obtiene la clave del usuario para poder intercambiar datos
	 * ACTION = 1
	 * @param usuario
	 * @return clave de usuario
	 */
	public int ObtenerClave(String usuario) throws ExcepcionHTTPProxy
	{
		HTTPProxy.nombre_usuario = usuario;
		String res = this.http.execute(this.host+"action=1&ni="+usuario);
		Log.v("HTTPProxy",res);
		
		HTTPProxy.clave_usuario = ParseIntData("ci",res);
		Log.v("HTTPProxy","CI:"+HTTPProxy.clave_usuario);
		return HTTPProxy.clave_usuario;
	}
	
	/**
	 * Inicia la sesion con el servidor para el intercambio de datos
	 * ACTION = 2
	 * @return
	 */
	public int IniciarSesion() throws ExcepcionHTTPProxy
	{
		String res = this.http.execute(this.host+"action=2&ni="+HTTPProxy.nombre_usuario+"&ci="+HTTPProxy.clave_usuario);
		Log.v("HTTPProxy",res);
		HTTPProxy.sid = ParseIntData("ids",res);
		return HTTPProxy.sid;
	}

	/**
	 * Solicitud para transferir dato de conectividad
	 * ACTION = 3
	 * @param idDato id del dato que va a ser transferido
	 * @param timestamp timestamp del dato a ser transferido
	 * @param estaConectado se encuentra con conectividad (true) o sin conectividad (false) 
	 * @param TipoDeConexion [mobile,wifi]
	 * @return
	 */
	public boolean EnviarDatos(int idDato,long timestamp, boolean estaConectado,String TipoDeConexion) throws ExcepcionHTTPProxy
	{
		try
		{
			
			Log.i("HttpProxy","++ Enviando datos al Servidor");
		
			// Tipo de Conectividad
			String contype = "mobile"; 
			if(TipoDeConexion.toUpperCase().indexOf("WIFI")>=0)
			{
				contype = "wifi";
			}
		
			String url = this.host+"action=3&ni="+HTTPProxy.nombre_usuario+"&ids="+HTTPProxy.sid+"&idd="+idDato+"&timestamp="+timestamp+"&con="+estaConectado+"&contype="+contype;
		
			Log.i("HttpProxy","++ Peticion al servidor: "+url);
		
			// Envio la peticion al server
			String res = this.http.execute(url);
			
			Log.i("HttpProxy","++ Respuesta del servidor: "+res);
			
			// Parseo la respuesta del server
			// <success action="3" ni="hola" ids="1147762958" idd="2"/>
			int newidd = ParseIntData("idd",res);
			
			Log.i("HttpProxy","++ IID de Retorno: "+newidd);
			
			return true;
		}
		catch(Exception e)
		{
			return false;
		}
			/*
			if(newidd==idDato)
			{
				return true;
			}
			return false;
			*/
	}
	
	public int FinalizarSesion() throws ExcepcionHTTPProxy
	{
		return 1;
	}
	
	/**
	 * Cierra la sesion con el servidor
	 * ACTION = 4
	 * @return
	 */
	public void CerrarSesion() throws ExcepcionHTTPProxy
	{
		this.http.execute(this.host+"action=4&ni="+HTTPProxy.nombre_usuario+"&ids="+HTTPProxy.sid);
		HTTPProxy.sid = 0;
	}	
	
	private int ParseIntData(String tag,String data) throws ExcepcionHTTPProxy
	{
		String[] exp = data.split("@|:");
		
		Log.v("HTTPProxy","Primer Valor: "+exp[0]);
		
		if(exp[0].trim().equals("Failure")==true)
		{
			ExcepcionHTTPProxy e = new ExcepcionHTTPProxy();
			e.setMessage(0);
			throw e;
		}
		else
		{
			for (int i = 0; i < exp.length; i++) 
			{
				String val = exp[i].trim();
				if(val.compareTo(tag)==0)
				{
					String datax = exp[i+1].trim();
					return Integer.parseInt(datax);
				}
			}
		}
		return 0; 
		 
	}
	
	
	
	
	
	
	/**
	 * Creo una excepcion que va a ser tirada cada vez que se 
	 * genere un error HTTP (osea XML con codigo de error)
	 * 
	 * @author iuga
	 *
	 */
	public class ExcepcionHTTPProxy extends Exception
	{
		String[] error = 
		{
		  "Error: 0 - Error de Conexion - El servidor no está respondiendo\n intentelo nuevamente más tarde.",
		  "Error: 1 - ActionRequestInvalidException - Acción inválida",
		  "Error: 2 - MissingParameterValue - Parámetro requerido para la acción no proporcionado",
		  "Error: 3 - InvalidParameterValue - Valor proporcionado para una parámetro inválido",
		  "Error: 4 - UnknownException - Excepción genérica",
		  "Error: 5 - CredentialsInvalid - Credenciales para el inicio de sesión inválidas - Nombre identificatorio o clave identificatoria inválidas (o no generada)",
		  "Error: 6 - SessionCredentialsInvalid - Credenciales de sesión no válidas - Nombre identificatorio o identificador se sesión inválida",
		  "Error: 7 - InvalidParameterEnumValue - Valor proporcionado para una parámetro inválido cuando este acepta una conjunto preestablecido de valores",
		  "Error: 8 - DuplicatedSessionValue - Valor proporcionado para un parámetro previamente utilizado. Este aplica inicialmente cuando se intenta tranferir un dato cuyo identificador fue previamente utilizado en una trasnferencia."
		};

		private int TipoError; 
		
		public void setMessage(int TipoError)
		{
			this.TipoError = TipoError;
		}
		
		@Override
		public String getMessage() 
		{
			return error[this.TipoError];
		}
	}
	
	
	public static boolean isSessionStarted()
	{
		if(HTTPProxy.sid!=0)
		{
			return true;
		}
		return false;
	}
	
}
